/* 
 * File:   ServerSocket.h
 * Author: mauro
 *
 * Created on 28 de septiembre de 2014, 00:07
 */

#ifndef SERVERSOCKET_H
#define	SERVERSOCKET_H

#include <iostream>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <iostream>

// 0 No recibo datos
// 1 No envio datos
// 2 no enviar ni recibir (al igual que close())
#define HOW 2; 

using namespace std;
class ServerSocket {
private:
//    int client;
    int server;
    struct sockaddr_in serverAddress;
//    struct sockaddr_in clientAddress;
public:
    ServerSocket();    
   
    //pre: 
    //pos: Crea un socket
    //return: socket creado. -1 en caso de error.
    int initSocket();
    
    
    //pre: Datos del servidor, ip, port, de conexion
    //pos: Inicializa el servido y estable el puerto de conexion (bind)
    //return: -1 en caso de error
    int initServer(char *ip, int port);
            
    //pre: Escucha las llamadas entrantes y pasará a cola, esperando
    //ser aceptada (accept())
    //pos: El servidor espera llamadas entrantes
    //return: -1 en caso de error.
    int listen ( int backLog); //"Por favor, que alguien me llame"
    
    
    //pre: Acepta una conexion entrante (conexiones pendientes en cola).    
    //pos: Devuelve un socket (cliente), listo para enviar y recibir.
    //es decir se acepto una conexion pendiente.
    //return: Devuelve un socket (cliente). -1 en caso de error.    
    int accept(struct sockaddr_in clientAddress); //"gracias por llamar al puerto xxx"
    
    
    //envia datos al socket que se obtiene por socket() o bien accept().
    //length es la longitud de esos datos en bytes
    //Comunicacion
    //pre: Socket destino devuelto por accept().
    //pos: comunicacion.
    //return:devuelve el numero de bytes que se enviaron. -1 en caso de error
    int send(int socket, void *cad, int length);
    //se encarga de enviar todo los datos.
    int sendAll(int socket,void* buf, int len);
    
    //Recibe los datos del cliente. Y establece un tiempo de espera.
    //return: -2 timeOut, -1 Error, 0 se cerro la conexion.
    int recvTimeOut(int socket,void* buf, int len, int timeOut);
    
    
    //pre: Socket es el fichero del que se va a leer.
    //pos: comunicacion.
    //return:numero de bytes  recibidos en caso de exito
    int receive(int socket,void *cad, int length);
    //Se encarga de recibir todos los datos.
    int receiveAll(int socket, void *buf, int length);
    
    //pre:   
    //pos:
    //return:    
    int getSocket();
    
    void close(); 
    //-1 en caso de error,

    virtual ~ServerSocket();
};

#endif	/* SERVERSOCKET_H */

